package com.neuedu.service.impl;

import com.google.common.base.Splitter;
import com.neuedu.common.Const;
import com.neuedu.common.JSONData;
import com.neuedu.dao.CartMapper;
import com.neuedu.dao.ProductMapper;
import com.neuedu.dao.ProductSKUMapper;
import com.neuedu.pojo.Cart;
import com.neuedu.pojo.Product;
import com.neuedu.pojo.ProductSKU;
import com.neuedu.service.CartService;
import com.neuedu.utils.BigDecimalUtil;
import com.neuedu.vo.CartProductVo;
import com.neuedu.vo.CartVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Service(value = "cartService")
public class CartServiceImpl implements CartService {
    @Autowired
    private CartMapper cartMapper;
    @Autowired
    private ProductSKUMapper productSKUMapper;
    @Autowired
    private ProductMapper productMapper;

    public JSONData<CartVo> addProduct(Integer productId, Integer count, Integer userId) {
        //-先判断购物车中是否有此商品，如果有：追加，否则，添加新数据
        //-userid-productid
        Cart cart = cartMapper.selCartByUserIdAndProductId(userId, productId);
        //-购物车中没有此商品的存在，则新增
        if(cart==null){
            Cart cartItem = new Cart();
            cartItem.setUserId(userId);
            cartItem.setProductId(productId);
            cartItem.setQuantity(count);
            //-只要是新增的商品，默认都是被选中的状态
            cartItem.setChecked(Const.CHECKED);

            int num = cartMapper.insert(cartItem);
            if(num==0){
                return JSONData.buildError("购物车商品添加失败");
            }
        }else{//-购物车中有此商品，则只需要修改商品的数量 即可
            count = cart.getQuantity() + count;
            cart.setQuantity(count);
            int num = cartMapper.updateByPrimaryKey(cart);
            if(num==0){
                return JSONData.buildError("购物车商品添加失败");
            }
        }
        //-商品添加成功之后，将购物车中所有的商品信息显示出来
        //-购物车商品列表的查询
        //-思考：购物车中应该显示哪些信息？
        CartVo cartVo = this.queryCartAllInfoByUserId(userId);
        return JSONData.buildSuccess(cartVo);
    }

    //-查询购物车商品列表
    public CartVo queryCartAllInfoByUserId(Integer userId){
        //-定义返回的对象
        CartVo cartVo = new CartVo();
        //-定义商品扩展类的集合
        List<CartProductVo> cartProductVoList = new ArrayList<CartProductVo>();
        //-定义购物车中商品的总价格
        BigDecimal cartTotalPrice = new BigDecimal("0");
        //-查询当前用户在购物车中所有的商品
        List<Cart> carts = cartMapper.selCartInfoByUserId(userId);
        if(!CollectionUtils.isEmpty(carts)){
            for(Cart cart:carts){
                //-定义 购物车 与 商品的扩展类
                CartProductVo cartProductVo = new CartProductVo();
                //-添加购物车相关信息
                cartProductVo.setId(cart.getId());
                cartProductVo.setUserId(cart.getUserId());
                cartProductVo.setProductId(cart.getProductId());
                cartProductVo.setQuantity(cart.getQuantity());
                cartProductVo.setProductChecked(cart.getChecked());
                //添加商品信息
                ProductSKU productSKU = productSKUMapper.selectByPrimaryKey(cart.getProductId());
                if(productSKU!=null){
                    cartProductVo.setProdcutPrice(productSKU.getSellprice());
                    cartProductVo.setProductTotalPrice(BigDecimalUtil.mul(productSKU.getSellprice().doubleValue(),cart.getQuantity()));
                    //--查询商品信息
                    Product product = productMapper.selectByPrimaryKey(productSKU.getProductId());
                    cartProductVo.setProductName(product.getName());
                    cartProductVo.setProductSubTitle(product.getSubtitle());
                    cartProductVo.setProductMainImage(product.getMainImage());
                }
                //-判断当前商品是否被选中，如果被选中，则将当前商品的总价，加到 购物车的总价中
                if(cart.getChecked()==Const.CHECKED){
                    cartTotalPrice = BigDecimalUtil.add(cartTotalPrice.doubleValue(),cartProductVo.getProductTotalPrice().doubleValue());
                }
                //-每个商品的信息添加到集合中
                cartProductVoList.add(cartProductVo);
            }
        }

        cartVo.setCartProductVoList(cartProductVoList);
        cartVo.setCartTotalPrict(cartTotalPrice);
        //-添加所有的商品是否被选中：
        cartVo.setAllChecked(selCartStatusByUserId(userId));
        return cartVo;
    }

    //-查询当前用户的商品是否全部被选中
    private boolean selCartStatusByUserId(Integer userId){
        int num = cartMapper.selCartStatusByUserId(userId);
        //num:0  全部被选中了
        return num==0;
    }


    public JSONData<CartVo> updateCartProductNum(Integer userId, Integer count, Integer productId) {
        //-查询出购物车相对应的记录
        Cart cart = cartMapper.selCartByUserIdAndProductId(userId, productId);
        cart.setQuantity(count);
        int num = cartMapper.updateByPrimaryKey(cart);
        if(num==0){
            return JSONData.buildError("修改失败");
        }
        //-修改成功之后，将所有的信息返回回去
        CartVo cartVo = this.queryCartAllInfoByUserId(userId);
        return JSONData.buildSuccess(cartVo);
    }

    public JSONData<Integer> selCartProductCount(Integer userId) {
        int num = cartMapper.selCartProductCount(userId);
        return JSONData.buildSuccess(num);
    }

    public JSONData<CartVo> delProduct(Integer userId, String productIds) {
        //-productIds 字符串的拆分
        List<String> productIdList = Splitter.on(",").splitToList(productIds);
        if(CollectionUtils.isEmpty(productIdList)){
            return JSONData.buildError("操作失败");
        }
        int num = cartMapper.deleteProduct(userId, productIdList);
        if(num==0){
            return JSONData.buildError("操作失败");
        }
        //-删除成功之后，将所有的信息返回回去
        CartVo cartVo = this.queryCartAllInfoByUserId(userId);
        return JSONData.buildSuccess(cartVo);
    }

}
